<?php

declare(strict_types=1);

namespace Zlf\AppValidate\Rule;

/**
 * URL验证器
 */
class UrlValidate extends RuleAbstract
{
    /**
     * 默认错误消息
     * @var string
     */
    protected $_error = '{label}不是有效的URL地址';

    /**
     * 验证逻辑实现
     *
     * @param mixed $value 待验证的值
     * @param string $label 字段标签，用于替换错误信息中的占位符
     * @return bool 验证是否通过
     */
    public function validate($value, string $label = ''): bool
    {
        // 检查输入是否为字符串类型且长度小于2000字符
        if (is_string($value) && strlen($value) < 2000) {
            // 如果允许跳过空值且值为空，则直接通过验证
            if (empty($value) && $this->_noSkipping === true) {
                $this->_value = $value;
                return true;
            }

            // 解析URL
            $pars = parse_url($value);
            //检查scheme是否以http或https开头
            if (isset($pars['scheme']) && isset($pars['host']) && $this->startsWithHttpOrHttps($pars['scheme'])) {
                $this->_value = $value;
                return true;
            }
        }

        // 添加错误信息并返回false表示验证失败
        $this->addError($this->_error, $label);
        return false;
    }

    /**
     * 自定义函数，用于检查给定字符串是否以http或https开头
     *
     * @param string $scheme 要检查的字符串
     * @return bool 是否以http或https开头
     */
    private function startsWithHttpOrHttps(string $scheme): bool
    {
        return strpos($scheme, 'http') === 0;
    }
}